Apollo Client
https://www.apollographql.com/docs/react
Apollo Client is a comprehensive state management library for JavaScript.
(Apollo Client は JavaScript のための 包括的 な状態管理ライブラリです。)
包括的な状態管理ライブラリ
アプリケーションの状態管理においてひと通り必要な機能が揃っている意 radish-miyazaki.icon
It enables you to manage both local and remote data with GraphQL.
(これを使用することで、ローカルおよびリモートのデータをGraphQLを使って管理することができます。)
Use it to fetch, cache, and modify application data, all while automatically updating your UI.
(アプリケーションのデータを取得、キャッシュ、変更しながら、UIを自動的に更新してくれるという機能を持っています。)
GraphQL で取得したデータが変更された場合、その変更を元に UI を自動的に更新してくれる radish-miyazaki.icon
2022 年 ~ からは、同じ機能を持っていて REST API にも対応している Tanstack Query が使われているイメージ radish-miyazaki.icon
Apollo Client の利用
ApolloClient のインスタンスの作成
https://www.apollographql.com/docs/react/get-started#step-3-initialize-apolloclient
code:ts
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache(),
});
link: 使用するすべての Link(後述)を concat で連結して渡す
cache: クエリの結果をキャッシュとして保存するために用いる
作成した Client を利用するコンポーネントを、<ApolloProvider> でラップする
client Props に作成した Client を渡す
code:src/App.tsx
function App() {
return (
<ApolloProvider client={client}>
<RouterProvider router={router} />
</ApolloProvider>
);
}
Query / Mutation の実行には useQuery / useMutation を用いる
https://www.apollographql.com/docs/react/data/queries/#usequery-api
code:jsx
const { loading, error, data } = useQuery(gql`
query GetDogs {
dogs {
id
breed
}
}
`);
https://www.apollographql.com/docs/react/data/mutations/#usemutation-api
code:jsx
const mutateFunction, { data, loading, error } = useMutation(gql`
mutation IncrementCounter {
currentValue
}
`);
関数コンポーネントの外で処理したい場合
ApolloClient の query / mutate メソッドを実行することで実現できるっぽい? radish-miyazaki.icon
https://www.apollographql.com/docs/react/api/core/ApolloClient#query
https://www.apollographql.com/docs/react/api/core/ApolloClient#mutate
Apollo Link Architecture
https://www.apollographql.com/docs/react/api/link/introduction
Link とは
GraphQL サーバとの HTTP リクエスト・レスポンスのフローを管理・制御するためのインタフェース
ミドルウェア のように動作し、リクエストを修正したり、レスポンスを処理したり、エラーハンドリングを追加したりすることが可能
https://maku.blog/p/xa62yo4/img-001.drawio.svg
https://maku.blog/p/xa62yo4/
組み込みの Link(一部)
HttpLink: https://www.apollographql.com/docs/react/api/link/apollo-link-http
HTTP を介して GraphQL リクエストを送信するための Link
デフォルトで使用される Link
code:js
import { HttpLink } from '@apollo/client';
const link = new HttpLink({
uri: "http://localhost:3000/graphql"
});
onError: https://www.apollographql.com/docs/react/api/link/apollo-link-error/
エラーのキャッチと処理を行うための Link
code:js
import { onError } from "@apollo/client/link/error";
// Log any GraphQL errors or network error that occurred
const errorLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors)
graphQLErrors.forEach(({ message, locations, path }) =>
console.log(
[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}
)
);
if (networkError) console.log([Network error]: ${networkError});
});
RetryLink: https://www.apollographql.com/docs/react/api/link/apollo-link-retry/
ネットワークエラーが発生した際にリクエストを再試行するための Link
code:js
import { RetryLink } from "@apollo/client/link/retry";
const link = new RetryLink();
BatchHttpLink: https://www.apollographql.com/docs/react/api/link/apollo-link-batch-http
複数のリクエストを 1 つのバッチにまとめて送信するための Link
code:js
import { BatchHttpLink } from "@apollo/client/link/batch-http";
const link = new BatchHttpLink({
uri: "http://localhost:4000/graphql",
batchMax: 5, // No more than 5 operations per batch
batchInterval: 20 // Wait no more than 20ms after first batched operation
});
カスタム Link を作成することもできる
認証トークンを Authorization リクエストヘッダに付与する
code:jsx
import { setContext } from '@apollo/client/link/context';
const authLink = setContext((_, { headers }) => {
const token = localStorage.getItem('authToken');
return {
headers: {
...headers,
authorization: token ? Bearer ${token} : "",
}
};
});
#JavaScript #TypeScript #React